#============================================
# #知识点
# 进程池与线程池(掌握)
# 先回顾之前TCP服务端实现并发的效果是怎么玩的
# 每来一个人就开设-个进程或者线程去处理
# 无论是开设进程也好还是开设线程也好是不是都需要消耗资源
# 只不过开设线程的消耗比开设进程的稍微小一点而已
# 我们是不可能做到无限制的开设进程和线程的因为计算机硬件的资源更不上! ! !
# 硬件的开发速度远远赶不上软件呐
# 我们的宗旨应该是在保证计算机硬件能够正常工作的情况下最大限度的利用它

# 什么是池?
# 池是用来保证计算机硬件安全的情况下最大限度的利用计算机
# 它降低了程序的运行效率
# 保证了计算机的运行安全，从而让你写的程序正常运行
#============================================
# from concurrent.futures import ThreadPoolExecutor
# def task(i):
#     x= i*i
#     print(x)
#     return x

# if __name__ == "__main__":
#     pool = ThreadPoolExecutor(5)  #默认线程为你的cup乘5,创建出来就只有那几个固定的cpu(5个)
#     res_list = []
#     for i in range(20):
#         res = pool.submit(task,i)  #任务异步提交  
#         res_list.append(res)  
#     pool.shutdown()       #等待线程池所有任务运行完毕，关闭线程池
#     print("====================")
#     for i in res_list:
#         print(i.result()) #拿到异步提交的结果
#============================================
# 返回结果如何获取? ? ?
# 异步提交任务的返回结果应该通过回调机制来获取
# 回调机制
# 就相当于给每个异步任务绑定了一个定时炸弹
# -旦该任务有结果立刻触发爆炸
from concurrent.futures import ProcessPoolExecutor
def task(n):
    n+=1
    print(n)
    return n

def list(i):
    print("结果:",i.result())
    global l
    l.append(i.result())


if __name__ == "__main__":
    l = []
    pool = ProcessPoolExecutor()
    for i in range(5):
        res = pool.submit(task,i).add_done_callback(list)
    # pool.shutdown()
    # print(l)
#============================================